package com.hsc.www.redis.jedisLettuce.jedis;

import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.List;

public class JedisClient {

    /**
     * 使用jedis：当多线程使用同一个连接时，是线程不安全的。所以要使用连接池，为每个jedis实例分配一个连接。
     * 使用Lettuce：当多线程使用同一连接实例时，是线程安全的。
     */
    @Test
    public void test1() {
        Jedis jedis = getJedis();
        //字符串
        jedis.set("name", "老王");
        System.out.println("姓名:" + jedis.get("name"));
        //链表
        jedis.lpush("hobbies", "篮球");
        jedis.lpush("hobbies", "羽毛球");
        List<String> list = jedis.lrange("hobbies", 0, 1);
        for (int i = 0; i < list.size(); i++) {
            System.out.println("爱好: " + list.get(i));
        }
    }


    /**
     * Jedis 在多线程中是不安全的
     *
     * @throws Exception
     */
    @Test
    public void test2() throws Exception {
        //获取 jedis
        Jedis jedis = new Jedis("106.12.180.184", 6379);
        jedis.set("key", "0");
        Thread.sleep(2000);
        System.out.println("===============");
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                String value = jedis.get("key");
                System.out.println("value=" + value);
                jedis.set("key", Integer.valueOf(value) + 1 + "");
            }).start();
        }
        Thread.sleep(20000);
        jedis.close();

    }


    private static Jedis getJedis() {
        Jedis jedis = new Jedis("106.12.180.184", 6379);
        System.out.println("Redis连接状态: " + jedis.ping());
        return jedis;
    }

    /**
     * Jedis 在多线程中是不安全的
     *
     * @throws Exception
     */
    @Test
    public void test3() throws Exception {
        Runnable runnable = () -> {
            Jedis jedis = getJedis();
            String str = jedis.get("k1");
            System.out.println("str=" + str);
            Integer i = Integer.valueOf(str);
            jedis.set("k1", (i + 1) + "");
        };
        getJedis().set("k1", "0");
        for (int i = 0; i < 100; i++) {
            new Thread(runnable).start();
        }
        Thread.sleep(10 * 1000);
    }

    @Test
    public void test4() throws Exception {
        //获取 jedis
        Jedis jedis = JedisClientPool.borrowJedis();
        jedis.set("key", "0");
        //归还 jedis
        JedisClientPool.returnJedis(jedis);
        Thread.sleep(2000);
        System.out.println("===============");
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                Jedis jds = JedisClientPool.borrowJedis();
                String value = jds.get("key");
                System.out.println("value=" + value);
                jds.set("key", Integer.valueOf(value) + 1 + "");
                JedisClientPool.returnJedis(jds);
            }).start();
        }
        while (true) ;
    }


}
